from pyramid.config import Configurator
from pyramid.authentication import AuthTktAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy
from pyramid_beaker import session_factory_from_settings

from sqlalchemy import engine_from_config

from alpha.modelos import initialize_sql


def main(global_config, **settings):
    """ This function returns a WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    initialize_sql(engine)
    session_factory = session_factory_from_settings(settings)
    authn_policy = AuthTktAuthenticationPolicy(
        'sosecret')
    authz_policy = ACLAuthorizationPolicy()
    config = Configurator(settings=settings,
                          root_factory='alpha.modelos.models.RootFactory',
                          authentication_policy=authn_policy,
                          authorization_policy=authz_policy,
        		  session_factory=session_factory)


    config.add_static_view('static', 'alpha:static', cache_max_age=3600)

    config.add_route('redirect', '/')
    config.add_route('main', '/main')
    config.add_route('login', '/login')
    config.add_route('logout', '/logout')
    config.add_route('usuarios', '/usuarios')
    config.add_route('roles', '/roles')
    config.add_route('proyectos', '/proyectos')
    config.add_route('listarUsuarios', '/listarUsuarios')
    config.add_route('listarRoles', '/listarRoles')
    config.add_route('listarProyectos', '/listarProyectos')
    config.add_route('crearUsuarios', '/crearUsuarios')
    config.add_route('ingresar', '/ingresar')
    config.add_route('eliminarUsuarios', '/eliminarUsuarios')
    config.add_route('modificarUsuarios', '/modificarUsuarios')
    config.add_route('eliminarRol', '/eliminarRol')
    config.add_route('modificarRol', '/modificarRol')    
    config.add_route('crearRol', '/crearRol')
    config.add_route('asignarRol', '/asignarRol')
    config.add_route('eliminarProyecto', '/eliminarProyecto')
    config.add_route('modificarProyecto', '/modificarProyecto')    
    config.add_route('crearProyecto', '/crearProyecto')
    config.add_route('iniciarProyecto', '/iniciarProyecto')
    config.add_route('terminarProyecto', '/terminarProyecto')

    config.add_view('alpha.vistas.views.redirect', route_name='redirect')
    config.add_view('alpha.vistas.views.listarUsuarios', route_name='listarUsuarios')
    config.add_view('alpha.vistas.views.listarRoles', route_name='listarRoles')
    config.add_view('alpha.vistas.views.listarProyectos', route_name='listarProyectos')
    config.add_view('alpha.vistas.login.ingresar', route_name='ingresar')
    config.add_view('alpha.vistas.views.eliminarUsuarios', route_name='eliminarUsuarios')
    config.add_view('alpha.vistas.views.modificarUsuarios', route_name='modificarUsuarios')
    config.add_view('alpha.vistas.views.eliminarRol', route_name='eliminarRol')
    config.add_view('alpha.vistas.views.modificarRol', route_name='modificarRol') 
    config.add_view('alpha.vistas.views.crearRol', route_name='crearRol')
    config.add_view('alpha.vistas.views.eliminarProyecto', route_name='eliminarProyecto')
    config.add_view('alpha.vistas.views.modificarProyecto', route_name='modificarProyecto') 
    config.add_view('alpha.vistas.views.crearProyecto', route_name='crearProyecto')
    config.add_view('alpha.vistas.views.iniciarProyecto', route_name='iniciarProyecto')
    config.add_view('alpha.vistas.views.terminarProyecto', route_name='terminarProyecto')
    config.add_view('alpha.vistas.views.asignarRol', route_name='asignarRol')
    

    config.add_view('alpha.vistas.views.main', route_name='main',
                    renderer='alpha:templates/main.pt', permission='view')
    config.add_view('alpha.vistas.views.crearUsuarios', route_name='crearUsuarios')
    config.add_view('alpha.vistas.views.usuarios', route_name='usuarios',renderer='alpha:templates/usuarios.pt', permission='edit')
    config.add_view('alpha.vistas.views.roles', route_name='roles',renderer='alpha:templates/roles.pt', permission='edit')  
    config.add_view('alpha.vistas.views.proyectos', route_name='proyectos', 
                    renderer='alpha:templates/proyectos.pt', permission='edit')                  
    config.add_view('alpha.vistas.login.login', route_name='login', 
                    renderer='alpha:templates/login.pt')
    config.add_view('alpha.vistas.login.logout', route_name='logout',permission='edit')



    return config.make_wsgi_app()
